package org.example.design.singleton;

import org.example.util.Function;

/**
 * @author huangshen
 * @version 0
 * @description 懒汉式 - 线程安全 - 双重检查
 * @since 2022/1/29 19:24
 */
public class LazySingletonThreadSafe {
    /**
     *  饿汉式 双重检查：
     *      优点： double-check保证了线程安全，延迟加载，效率较高
     *      缺点： 反射依旧可以实例化
     *
     */
    private static volatile LazySingletonThreadSafe instance;

    private LazySingletonThreadSafe() {}

    public static LazySingletonThreadSafe getInstance() {
        if (Function.equalsNull(instance)) {
            synchronized (LazySingletonThreadSafe.class) {
                if (Function.equalsNull(instance)) {
                    instance = new LazySingletonThreadSafe();
                }
            }
        }
        return instance;
    }
}
